package net.freestu.sola.web.spider.urlfilter;

import net.freestu.sola.web.global.GlobleVar;

/**
 * @deprecated
 * 这个类在早期是用于将区别该链接是指向网页(html,shtml)的，还是其他类型的资源（mp3 doc）什么的。
 * 最后由于知识的积累，用到了报头判断的技术，这个类基本上已经废弃了。
 */

public class PostfixFilter extends FilterDecorator{//这设置的太搞笑了
	
	
	  public PostfixFilter(LinkFilter linkfilter){
			
			super(linkfilter);//在抽象类中进行构造对象。
			
		}
		
		//这个函数的质量有点高。复用性非常好。
		public void setState(){//检测状态。对LinkFilter的状态进行设置。这个貌似可以设置成private
			
			String str=linkfilter.getContent();//获取URL。
			int state=linkfilter.getState();//获取状态。
			
			
			if(state==URLFORBID){//如果不是不能通过的。
				
				return;
			}
			
			
			if(state==URLSTOP){//如果是处于暂停状态的。
				
				int temp=judgeState(str);
				linkfilter.setState(temp);
			}
			
			
			if(state==URLPASS){//如果是处于通过状态。
				
				//--------------9.24修改----------
				//int temp=judgeState(str);//按照逻辑来判定。
				//linkfilter.setState(temp);//
				//------------------------------
				
			   //URLPASS应该是至高无上的通行证。
				
				linkfilter.setState(URLPASS);
				
				
			}
			
			
		}
		
		//public abstract void goIfPass();//对状态进行选择执行。
		//public abstract void goIfContinue();
		//public abstract void goIfStop();
		
		public String getLinkAfterFilter(){//得到过滤后的链接。
			
			setState();//先设置状态。
			
			if(linkfilter.getState()==URLPASS){
				
				return linkfilter.getContent();
				
				}
			if(linkfilter.getState()==URLSTOP){
				
				return linkfilter.getContent();
				}
			
			if(linkfilter.getState()==URLFORBID){
				
				return null;
				}
			
			return null;
		}
		
		private int judgeState(String str){//成功。
			
			//String regex=".*/[\\w-]+\\.[\\w-]+$";//这个是成功的后面有.jsp等的匹配。!!!
			
			String regex=".*/[\\w-|=]+\\.[\\w-]+$";//这个是成功的后面有.jsp等的匹配。!!!
			
			//这个正则表达式貌似有错误吧？有一些并不能过滤掉
			
			
			//String sign=".html .shtml .jsp .php .asp .aspx .htm .do";//按空格分开。
			String sign=GlobleVar.PAGE_TYPE;

			if(str.matches(regex)){//有后缀名的URL，判断是否是指定的后缀名
				
				String[] signs=sign.split(" ");
				String temp;
				
				for(int i=0;i<signs.length;i++){
					
					temp=signs[i];
					//temp=temp.toLowerCase();这个地方没有考虑如果是大写怎么办。??
					
					if(str.endsWith(temp)){//如果是符合后缀名的。
						
						return URLPASS;
					}
				}
				
				return URLFORBID;
		
			}else{//没有后缀名的URL
				
				return URLPASS;
			}
		}
					
		public String getContent(){//在几个装饰器之间用这个函数传递。
			
			return getLinkAfterFilter();
		}
		
		//垃圾方法
		public int getState(){
			
			setState();
			
			return linkfilter.getState();//这个地方有点错。这个地方必须设置成反应后的啊
		}

	  public void setState(int i){
	  	
	  	linkfilter.setState(i);
	  }
	  	
	  
	  public static void main(String[] args){
	  	
	  	
	  	MyLink ml1=new MyLink("http://www.zuzhibu.cdut.edu.cn/admin/upload_file/asdsadfs.jsp?id=1");
	  	PostfixFilter ml2=new PostfixFilter(ml1);
	  	
	  	String str=ml2.getLinkAfterFilter();
	  	
	  	System.out.println(str);
	  	
	  	
	  	
	  }


		
	}